package com.itqf.exceptionhandler;

import com.itqf.util.ResponseUtil;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authz.AuthorizationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;



/**
 * projectName: gp_manage
 *
 * @author: 赵伟风
 * time: 2021/8/17 9:16
 * description:shiro的认证和授权失败处理器
 */
@ControllerAdvice
@CrossOrigin("*")
public class ShiroExceptionHandler {

    private static final Logger LOGGER = LoggerFactory.getLogger(ShiroExceptionHandler.class);

    /**
     * 未认证异常捕捉
     * @param exception
     * @return 返回501
     */
    @ExceptionHandler(AuthenticationException.class)
    @ResponseBody
    public Object unAuthentication(AuthenticationException exception){

        // LOGGER slf4j: trace 轨迹 debug 输出关键参数【1.参数可能发生异常 2.微服务阶段 服务之间的调用】 info 初始化和结束结点
        // warn  警告 可能会发生异常   dispatcherServlet  -- handler() -- 有 handler  -- 没有 -- onHandler() -- warn
        //       if 配合debug if warn
        // error 异常  catch / 异常处理器
        // commons-logging fatal

        //日志输出模板： 位置【类和方法】 异常信息【】  原因分析【】  解决方案【】  异常参数【】
        //             [类型：方法] --> [异常信息]{} ---> [原因分析]:{} ---> [解决方案]：{} ---> [核心参数]：{}
        //             核心参数： 非必须  / 解决方案： 非必须   原因分析： 有必要！  异常信息： 绝对必要   位置： 绝对有必要！

        //日志输出的建议： 1.有必要才输出日志  2.要输出有有意义的日志

        //LOGGER.warn("[{}:{}]-->[异常信息]:{}-->[原因分析]：{}-->[处理方案]：{}-->[核心参数]：null");

        return ResponseUtil.unlogin();
    }


    /**
     * 未授权异常捕捉
     * @param exception
     * @return 返回506
     */
    @ExceptionHandler(AuthorizationException.class)
    @ResponseBody
    public Object unAuthorization(AuthorizationException exception){

        return ResponseUtil.unauthz();
    }



}
